var findLength = function(nums1, nums2) {
  const [m, n] = [nums1.length, nums2.length];

  // dp[i][j] ：以下标i为结尾的nums1，和以下标j为结尾的nums2，最长重复子数组长度为dp[i][j]。 （特别注意： “以下标i - 1为结尾的A” 标明一定是 以A[i-1]为结尾的字符串 ）
  const dp = new Array(m).fill(0).map(() => new Array(n).fill(0));
  let ans = 0;

  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      if (nums1[i] === nums2[j]) {
        dp[i][j] = 1 + (i > 0 && j > 0 ? dp[i-1][j-1] : 0);
        ans = Math.max(ans, dp[i][j]);
      } else {
        dp[i][j] = i > 0 && j > 0 ? dp[i-1][j-1] : 0;
      }
    }
    console.log(dp);
  }

  return ans;
}

const nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7];
console.log(findLength(nums1, nums2)); // Output: 3